﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace SmartCity.ProcessEngine.Infrastructure.Extention
{
    /// <summary>
    /// 枚举扩展 (枚举(列举几个固定属性的类)  扩展方法 (为了方便调用的静态方法)  字典(用来装键值对的集合)  反射(目的就是读到源码) )
    /// 枚举的扩展方法  1.静态类 2.静态方法 ,并且  this T t T代表方法是枚举的扩展方法
    /// </summary>
    public static class EnumExtention
    {
        /// <summary>
        /// 获取枚举值的列表  
        /// </summary>
        /// <typeparam name="T">本方法中,T 代表枚举类型</typeparam>
        /// <param name="t"></param>
        /// <returns></returns>
        public static Dictionary<int, string> GetEnumValues<T>() where T : Enum
        {

            Type type = typeof(T);  //通过反射拿到了枚举类型的元信息
            Array array = Enum.GetValues(type);//把枚举类型转成数组
            Dictionary<int, string> dic = new Dictionary<int, string>();
            foreach (T item in array)
            {
                var key = Convert.ToInt32(item); //取枚举的值
                var value = item.GetDescription();//取枚举的描述,调用的是扩展方法.
                dic.Add(key, value);//把枚举里的值和描述放到字典键值对中
            }
            //在类的方法里,怎么取 EnumExtention类名

            return dic;
        }

        /// <summary>
        /// 获取枚举属性的的描述
        /// </summary>
        /// <param name="value">枚举值</param>
        /// <returns>枚举的描述</returns>
        public static string GetDescription(this Enum value) {

            FieldInfo fieldInfo = value.GetType().GetField(value.ToString()); //取到枚举的属性
            DescriptionAttribute descriptionAttribute = fieldInfo.GetCustomAttribute<DescriptionAttribute>();//取枚举属性上的特性
            if (descriptionAttribute != null)//如果能取到描述特性,就返回描述
            {
                return descriptionAttribute.Description;
            }
            else {
                return "";//取不到返回空
            }
        }

 


        //public static string GetDescription(this Enum value)
        //{
        //    FieldInfo filedInfo = value.GetType().GetField(value.ToString());
        //    DescriptionAttribute? attribute = filedInfo.GetCustomAttribute<DescriptionAttribute>();
        //    return attribute != null ? attribute.Description : null;
        //}
    }
}
